home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / games / ippon / source.lzh / FuncEnemy / searchz.c < prev    next >
C/C++ Source or Header  |  2000-07-07  |  4KB  |  193 lines

  1. /* searchz.c 自機をサーチするザコ */
  2. #include <xsp2lib.h>
  3.  
  4. #include "../main.h"
  5. #include "../player.h"
  6. #include "../enemy.h"
  7. #include "../eshot.h"
  8. #include "../effect.h"
  9. #include "../psearch.h"
  10. #include "../sound.h"
  11.  
  12.  
  13. #define PALET_MAIN    0x0800
  14.  
  15. #define wabs(x) ((x) >= 0 ? (short) (x) : (short) -(x))
  16. #define abs(x)  ((x) >= 0 ? (int) (x) : (int) -(x))
  17.  
  18.  
  19. /* 関数プロトタイプ宣言 */
  20. static short EnemyMoveSearchZ (ENEMY *);
  21. static void EnemyFreeSearchZ (ENEMY *);
  22.  
  23.  
  24. /* 初期化ルーチン */
  25. void EnemyAllocSearchZ (ENEMY * p)
  26. {
  27.     signed short x = SHORT_LX;
  28.  
  29.     /* このザコに関してはX座標は中心からの距離で */
  30.     /* 常にプレイヤーの反対側に現れる */
  31.     if (player->x < 144) {
  32.         p->lx = (player->x + x) * 65536;
  33.         p->vx = 16384;
  34.     } else {
  35.         p->lx = (player->x - x) * 65536;
  36.         p->vx = -16384;
  37.     }
  38.     p->vy = 4 * 65536;
  39.  
  40.     p->angle = 64;
  41.     p->pt = obj_searchz + ((p->angle) >> 3);
  42.     p->info = PALET_MAIN | PRIORITY_ZAKO;
  43.     p->hit_sx = 12;
  44.     p->hit_sy = 12;
  45.     p->hp = 1;        /* 耐久力 */
  46.     p->damage = 0;
  47.     p->damage_mode = DAMAGE_THROUGH;
  48.  
  49.     p->func_enemy_move = EnemyMoveSearchZ;
  50.     p->func_enemy_free = EnemyFreeSearchZ;
  51.  
  52.     /* コア関連 */
  53.     p->core_info = PALET_CORE_RED | PRIORITY_ZAKO;
  54.     p->core_pt = sp_core + 1;
  55.  
  56.     p->m_work = 0;
  57.     p->m_work2 = 0;
  58.     p->m_work4 = 0;        /* 1回接近したか */
  59. }
  60.  
  61.  
  62.  
  63. /* 移動ルーチン */
  64. /* 返り値:非0なら消去 */
  65. static short EnemyMoveSearchZ (ENEMY * p)
  66. {
  67.     /* 速度を足して上位ワード(固定整数部)だけ取り出す */
  68.     p->x = (p->lx += p->vx) >> 16;
  69.     p->y = (p->ly += p->vy) >> 16;
  70.  
  71.     switch (p->m_work) {
  72.  
  73.         /* まず突っ込んでくる */
  74.     case 0:
  75.         if (p->m_work2++ > 16) {
  76.             p->m_work++;
  77.             p->m_work2 = 0;
  78.         }
  79.         break;
  80.  
  81.         /* 減速 */
  82.     case 1:
  83.         p->vy -= 32768;
  84.         if (p->vy <= 32768) {
  85.             p->m_work++;
  86.             p->m_work2 = 0;
  87.             p->m_work3 = 0;
  88.         }
  89.         break;
  90.  
  91.         /* 直線運動しつつこちらを向く */
  92.     case 2:
  93.         if (p->m_work2++ > 2) {
  94.             p->m_work2 = 0;
  95.             if (p->m_work3++ < 6) {
  96.                 /* 自機の方を向く */
  97.                 if ((unsigned char) (p->angle - psearch (p->x, p->y)) > (unsigned char) 128)
  98.                     p->angle += 4;
  99.                 else
  100.                     p->angle -= 4;
  101.                 p->pt = obj_searchz + ((p->angle) >> 3);
  102.             } else {
  103.                 if (wabs (player->x - SHORT_LX) > 32)
  104.                     p->m_work = 3;    /* 自機から遠ければ近付く */
  105.                 else
  106.                     p->m_work = 4;    /* 自機に近ければそのまま逃げる */
  107.                 p->m_work2 = p->m_work3 = 0;
  108.             }
  109.         }
  110.         break;
  111.  
  112.         /* 自機に近付く */
  113.     case 3:
  114.         if (p->m_work2++ > 2) {
  115.             p->m_work2 = 0;
  116.             /* 自機の方を向く */
  117.             if ((unsigned char) (p->angle - psearch (p->x, p->y)) > (unsigned char) 128)
  118.                 p->angle += 2;
  119.             else
  120.                 p->angle -= 2;
  121.             p->pt = obj_searchz + ((p->angle) >> 3);
  122.         }
  123.         p->m_work3++;
  124.         if ((p->m_work3 < 5) && ((abs (p->vx) < 1.5 * 65536) && (abs (p->vy) < 1.5 * 65536))) {
  125.             p->vx += xytable[0][p->angle].x;
  126.             p->vy += xytable[0][p->angle].y;
  127.         }
  128.         if ((p->m_work3 > 40) && (p->m_work4 < 1)) {
  129.             p->m_work = 4;
  130.             p->m_work2 = p->m_work3 = 0;
  131.             p->m_work4++;
  132.         }
  133.         break;
  134.  
  135.         /* 自機から遠ざかる */
  136.     case 4:
  137.         if (p->m_work2++ > 2) {
  138.             p->m_work2 = 0;
  139.             /* 自機の方を向く */
  140.             if ((unsigned char) (p->angle - psearch (p->x, p->y)) > (unsigned char) 128)
  141.                 p->angle += 2;
  142.             else
  143.                 p->angle -= 2;
  144.             p->pt = obj_searchz + ((p->angle) >> 3);
  145.         }
  146.         p->m_work3++;
  147.         if ((p->m_work3 < 3) && ((abs (p->vx) < 1.5 * 65536) && (abs (p->vy) < 1.5 * 65536))) {
  148.             p->vx -= xytable[0][p->angle].x;
  149.             p->vy -= xytable[0][p->angle].y;
  150.         }
  151.         if ((p->m_work3 > 40) && (p->m_work4 < 2)) {
  152.             p->m_work = 3;
  153.             p->m_work2 = p->m_work3 = 0;
  154.             p->m_work4++;
  155.         }
  156.         break;
  157.  
  158.     default:
  159.         break;
  160.     }
  161.  
  162.     /* 画面外に出たら消去 */
  163.     if ((p->m_work > 0)
  164.         && ((SHORT_LY < -32) || (SHORT_LY > 256 + 32)
  165.         || (SHORT_LX < -32) || (SHORT_LX > 256 + 32)))
  166.         return (-1);    /* 消去 */
  167.  
  168.  
  169.     /* もし前回ダメージを受けたなら */
  170.     if (p->damage) {
  171.         p->damage = 0;
  172.         EffectAlloc (EFFECT_EXPLZAKO, 0, p->x, p->y);    /* 爆発パターンを出現させる */
  173.         EffectAlloc (EFFECT_POINTS, points_table[p->shot_count], p->x, p->y);    /* 得点を出現させる */
  174.         SoundSetSE (SE_EXPL);    /* ザコ爆発音 */
  175.         return (-1);
  176.     }
  177.     xobj_set_st (p);    /* 表示 */
  178.  
  179.     /* コアの表示 */
  180.     p->core_x = p->x - 8;
  181.     p->core_y = p->y - 8;
  182.     xsp_set_st (&(p->core_x));
  183.  
  184.     return (0);
  185. }
  186.  
  187.  
  188.  
  189. /* 消去ルーチン */
  190. static void EnemyFreeSearchZ (ENEMY * p)
  191. {
  192. }
  193.